package com.cskaoyan.javase.oop2._2polymorphic._2advantage.cast;
/**
 * 向下转型
 * 语法:
 * 要强转的子类类型 对象名 = (要强转的子类类型)父类引用;
 *
 * 1.能够通过编译的前提是什么?
 *      要将父类引用强转成它继承链中的子类引用
 *      不能任意强转成没有关系的类型
 *
 * 2.能够运行成功,能够成功强转的前提是什么?
 *      因为运行时强转失败,程序会终止报错,抛出异常: ClassCastException
 *      这显然不是我们希望看到的
 *
 *      能够成功的条件是:
 *      强转后的子类引用要真的能够指向原先父类引用指向的对象
 *      这样强转才可能成功,否则一定会失败,抛出异常
 *      具体来说,强转后的引用的数据类型:
 *          1.要么就是这个对象的数据类型
 *          2.要么就是这个对象的父类类型(因为父类引用可以指向子类对象)
 *
 *
 * @since 10:10
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*Father f = new Father();
        Son s = (Son) f;
        // Uncle u = (Uncle) f;
        // Person p = (Person) f;
        Grandson gs = (Grandson) f;*/

        Grandfather gf = new Grandson();
        Father f = (Father) gf;
        Son s = (Son) gf;
        Grandson gs = (Grandson) gf;

        Object o = new Grandson();
    }
}
class Grandfather{}
class Father extends Grandfather{}
class Son extends Father{
}
class Grandson extends Son{}
class Uncle extends Grandfather{}
class Person{}